package cenas;

import pi.beta.CaoGuia.Estado;
import pi.beta.*;
import assets.Cenario;
import gatilhos.*;
import inimigos.*;
import obstaculos.*;

import org.anddev.andengine.audio.sound.SoundManager;
import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl;
import org.anddev.andengine.engine.camera.hud.controls.BaseOnScreenControl.IOnScreenControlListener;
import org.anddev.andengine.engine.camera.hud.controls.DigitalOnScreenControl;
import org.anddev.andengine.engine.handler.IUpdateHandler;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.input.touch.TouchEvent;
import org.anddev.andengine.opengl.texture.TextureManager;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TextureRegion;

import android.content.Context;
import android.util.Log;

import java.util.ArrayList;

public class Nivel extends Scene {

	public int largura;
	public int altura;
	public Cenario cenario;
	public Dono dono;
	public CaoGuia caoGuia;

	Context contexto;

	public GerenciamentoDeCenasEEntrada trocaDeCenas;
	
	public ArrayList<Sprite> vidasMostradasNaTela = new ArrayList<Sprite>();
	public ArrayList<Inimigo> inimigos = new ArrayList<Inimigo>();
	
	private BitmapTextureAtlas mapaDeTexturas, mapaTexturasControle, mapaTexturasBotao, mapaTexturasParabens, mapaTexturasBotaoPulo, mapaTexturasBriefing;
	private TextureRegion texturaVida, texturaControle, texturaBotao, texturaParabens, texturaBotaoPulo, texturaBriefing;
	
	public DeteccoesDeColisao deteccoesDeColisao;
	
	public Rectangle tileDaVitoria = null;
	public boolean venceu = false;
	public boolean comecou = false;
	
	private DigitalOnScreenControl controle;
	
	public boolean checkpointAtivado = false;
	public int xInicialCaoGuia, yInicialCaoGuia;
	public int xInicialDono, yInicialDono;
	
	public short timerBriefing = 0;//MAX = 250
	
	public Sprite instrucoes, botaoPulo;
	
	public boolean botaoAtivacaoDetonador;

	public Nivel(String nivel, GerenciamentoDeCenasEEntrada trocaDeCenas, Context contexto, int largura, int altura, TextureManager tm, SoundManager sm){
		this.contexto = contexto;
		this.largura = largura;
		this.altura = altura;
		this.trocaDeCenas = trocaDeCenas;
		cenario = new Cenario("Cenario.png", nivel, this, contexto, tm, sm);
		dono = new Dono("Dono.png", this, contexto, tm, sm);
		caoGuia = new CaoGuia("Cao guia.png", this, contexto, tm, sm);
		
		inicializaSprites(tm);
		
		for(int i = 0; i < caoGuia.vidas+1; i++){
			vidasMostradasNaTela.add(new Sprite(largura - (i*64), 0, texturaVida));
			attachChild(vidasMostradasNaTela.get(i));
		}
		
		controle = new DigitalOnScreenControl(32, 320, trocaDeCenas.principal.camera, texturaControle, texturaBotao, 0.05f, updateDoControle);
		botaoPulo = new Sprite(658, 352, texturaBotaoPulo) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				trataInput("PULO");
				botaoAtivacaoDetonador = true;
				return false;
			}
		};
		
		deteccoesDeColisao = new DeteccoesDeColisao(this);
		
		registerUpdateHandler(loop);
	}
	
	IOnScreenControlListener updateDoControle = new IOnScreenControlListener() {
		@Override
        public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) {
			if(pValueX == 1) {//DIREITA
				trataInput("DIREITA");
			} else if(pValueX == -1) {//ESQUERDA
				trataInput("ESQUERDA");
			} else{
				caoGuia.atualizaSprite(Estado.PARADO, true, false);
			}
			if(pValueY == 1) {//BAIXO
				if(caoGuia.pendurado){
					caoGuia.y = 160;
				}
			}
			if(pValueY == -1) {//CIMA
                botaoAtivacaoDetonador = true;
			}else{
                botaoAtivacaoDetonador = false;
			}
        }
	};

	IUpdateHandler loop = new IUpdateHandler() {
		@Override
		public void reset() {
		}
		
		@Override
		public void onUpdate(float arg0) {
			if(!comecou){
				timerBriefing++;
				if(timerBriefing == 100) {
					detachChild(instrucoes);
					caoGuia.sprite.animate(200, true);
					dono.sprite.animate(200, true);
					registerTouchArea(botaoPulo);
					setTouchAreaBindingEnabled(true);
					attachChild(botaoPulo);
					setChildScene(controle);
					comecou = true;
				}
			}else{
				if(!venceu){
					cicloDoNivel();
				}else{
					if(timerBriefing == 0) attachChild(new Sprite(0, 0, texturaParabens));
					timerBriefing++;
					dono.sprite.stopAnimation();
					caoGuia.sprite.stopAnimation();
					if(timerBriefing == 250) trocaDeCenas.carregaCena(trocaDeCenas.ESCOLHA_DE_NIVEIS);
				}
			}
		}
	};
	
	public void trataInput(String botao){
		if(botao.contentEquals("ESQUERDA") || botao.contentEquals("DIREITA")/*trocaDeCenas.botaoEsquerdo || trocaDeCenas.botaoDireito*/){
			if(botao.contentEquals("ESQUERDA")){//if(trocaDeCenas.botaoEsquerdo == true){
				caoGuia.atualizaSprite(Estado.ANDANDO, true, true);//true = esquerda
				move(true);
				trocaDeCenas.botaoEsquerdo = false;
			}
			if(botao.contentEquals("DIREITA")){//if(trocaDeCenas.botaoDireito == true){
				caoGuia.atualizaSprite(Estado.ANDANDO, false, true);//false = direita
				move(false);
				trocaDeCenas.botaoDireito = false;
			}
		}
        if(botao.contentEquals("PULO")/*trocaDeCenas.botaoPulo*/){
            //caoGuia.atualizaSprite(Estado.PULANDO_OU_PENDURADO, false, false);
            caoGuia.pula();
            trocaDeCenas.botaoPulo = false;
        }
	}
	
	public void recuperaSpriteParado(){
		caoGuia.atualizaSprite(Estado.PARADO, true, false);
	}
	
	public void move(boolean direcao){
		caoGuia.move(direcao);
		caoGuia.posicionaNaCena(cenario.MapX,cenario.MapY);
	}
	
	public void cicloDoNivel(){
		cenario.posicionaNaCena((int)caoGuia.x+(caoGuia.LARGURA/2)-(largura/2),0);//(int)caoGuia.y-(altura/2));
		tileDaVitoria.setPosition((int)tileDaVitoria.getInitialX()-cenario.MapX, (int)tileDaVitoria.getInitialY()-cenario.MapY);
		caoGuia.atualiza();
		dono.atualiza();
		for(Obstaculo obstaculo : cenario.obstaculos){
			obstaculo.atualiza();
		}
		for(Gatilho gatilho : cenario.gatilhos){
			gatilho.atualiza();
		}
		for(Inimigo inimigo : cenario.inimigos){
			inimigo.atualiza();
		}
		
		deteccoesDeColisao.atualiza(botaoAtivacaoDetonador);
		dono.posicionaNaCena(cenario.MapX,cenario.MapY);
		caoGuia.posicionaNaCena(cenario.MapX,cenario.MapY);

		if(dono.y > altura || caoGuia.y > altura){
			caoGuia.vidas = 0;
		}
		if(caoGuia.vidas == 0){
			trocaDeCenas.carregaCena(trocaDeCenas.FIM_DE_JOGO);
		}
	}
	
	public void inicializaSprites(TextureManager tm){
		mapaDeTexturas = new BitmapTextureAtlas(1024, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaVida = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaDeTexturas, contexto, "Vida.png", 0, 0);
		tm.loadTexture(mapaDeTexturas);
		
		mapaTexturasControle = new BitmapTextureAtlas(128, 128, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaControle = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaTexturasControle, contexto, "onscreen_control_base.png", 0, 0);
		tm.loadTexture(mapaTexturasControle);
		
		mapaTexturasBotao = new BitmapTextureAtlas(64, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaBotao = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaTexturasBotao, contexto, "onscreen_control_knob.png", 0, 0);
		tm.loadTexture(mapaTexturasBotao);
		
		mapaTexturasBotaoPulo = new BitmapTextureAtlas(128, 128, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaBotaoPulo = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaTexturasBotaoPulo, contexto, "Botao pulo.png", 0, 0);
		tm.loadTexture(mapaTexturasBotaoPulo);
		
		mapaTexturasBriefing = new BitmapTextureAtlas(1024, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaBriefing = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaTexturasBriefing, contexto, "Briefing.png", 0, 0);
		tm.loadTexture(mapaTexturasBriefing);
		
		instrucoes = new Sprite(0, 0, texturaBriefing);
		attachChild(instrucoes);
		
		mapaTexturasParabens = new BitmapTextureAtlas(1024, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaParabens = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaTexturasParabens, contexto, "Parabens.png", 0, 0);
		tm.loadTexture(mapaTexturasParabens);
	}
}